// 类型断言as不是类型转换，它不会真的影响到变量的类型
function toBoolean(something: any): boolean {
    return something as boolean
}

// 返回值是1
toBoolean(1)


// 若要进行类型转换，需要直接调用类型转换的方法
function toBoolean2(something: any): boolean {
    return Boolean(something)
}

// 返回值是true
toBoolean2(1)


interface Cat {
    name: string;

    run(): void;
}

// 类型断言as  vs 类型声明：

function getCacheData(key: string): any {
    return (window as any).cache[key]
}

// 类型断言
const tom = getCacheData('tom') as Cat;
tom.run()

//类型声明
const helloKitty: Cat = getCacheData('helloKitty')
helloKitty.run()


// a 断言为b时，a和b 重叠的部分即可
// a 声明为b时，a必须剧本b的所有属性和方法
// 因此 类型声明是比类型断言更加严格的
// 所以，为了增加代码质量，最好优先使用类型声明，这也比类型断言的as语法更加优雅


// 类型保护：用于解决联合类型的判断问题
// in 操作符 用于判断类型
// 类型断言 可以用于判断类型
// typeof 操作符用于判断类型
// instanceof 操作符用于判断类型
